package com.example.ioc;

// 构建车的程序 Car(车)-Framework(车身)-Bottom(底盘)-Tire(轮胎)
// 传统方式 耦合性太强 需要一步一步的乡下调用
public class NewCarExample {
    public static void main(String[] args) {
        Car car = new Car();
        car.init();
        // 如果自己输入size 也是一步一步向下调用
    }

    static class Car {
        public void init() {
            // 依赖车身
            Framework framework = new Framework();
            framework.init();
        }
    }

    static class Framework {
        public void init() {
            // 依赖底盘
            Bottom bottom = new Bottom();
            bottom.init();
        }
    }

    static class Bottom {
        public void init() {
            // 依赖轮胎
            Tire tire = new Tire();
            tire.init();
        }
    }

    static class Tire {
        private int size = 30;
        public void init() {
            System.out.println("轮胎尺寸" + size);
        }
    }


//此时，大家可以想象，只是添加一个功能，全部程序都要修改。
//结果显然易知，整个代码都在不停的进行整改。
//这就是耦合性强的代码所带来的缺陷:动一般代码，整体的代码都需要改。
//上述代码还只是最简单的一种，在公司里。那就不会有这么简单业务逻辑了。
//那么，如何让代码之间进行解耦合，让代码之间的影响降为零?
//答案:控制反转
//将关于的对象创建的权限交给"别人" (Spring)
//我们不再去关注什么时候去new对象，也不需要关注调用方法能不能接收多个参数。
//直接告诉ioc容器，我们需要使用这个类，然后，容器把这类给你
//我们直接使用就可以了。调用方法，传参即可。
//此时，我们只需要将原来由自己创建的下级类，改为传递的方式(也就是注入的方式)，因为我们不需要在当前类中创建下级类了，所以下级类即使发生变化(创建或减少参数)
//当前类本身也无需修改任何代码，这样就完成了程序的解耦。
//解耦指的是解决了代码的耦合性，耦合性也可以换一种叫法叫程序相关性 。
}
